home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Medal Software 3
/
Gold Medal Software - Volume 3 (Gold Medal) (1994).iso
/
graphics
/
jclplasm.arj
/
JCLPLASM.ASM
< prev
next >
Wrap
Assembly Source File
|
1994-02-04
|
9KB
|
246 lines
; **************************************************************************
; **************************************************************************
; **** ****
; **** JCL-Plasma v1.3a (C) 1994 JCL-software ****
; **** ****
; **** This .asm file contains a routine to display a 'plasma' type ****
; **** image. It requires at least a 386, and 486/33 is recommended. ****
; **** Also required is a file PLASMA.DAT, which contains image, ****
; **** 'movement', and colour palette information pregenerated for ****
; **** speed by the file PLGENPLM.C ****
; **** ****
; **** This file was compiled using TASM 2.5, and very experienced ****
; **** programmers might want to have a quiet laugh about how badly ****
; **** this is coded... however, this is BY FAR the fastest plasma ****
; **** I have seen, and also runs in FULL 320x200 resolution, at ****
; **** 70 fps on my 486DX/33 (Local bus) ****
; **** ****
; **** Thanks go to Thomas Hagen, whose plasma inspired me to get one ****
; **** that worked full screen, and whose original function I ****
; **** 'borrowed' until I finally got round to working one out by ****
; **** myself.. ****
; **** ****
; **** Please send any (helpful) comments to me (Jeremy Longley) at ****
; **** jcl1008@cus.cam.ac.uk (or Selwyn College, CAMBRIDGE, UK) ****
; **** ****
; **** Jezza (3/2/94 02:06 (groan...)) ****
; **** ****
; **************************************************************************
; **************************************************************************
.MODEL tiny
; **** Macros ****
end_process macro return_code
mov al,return_code
mov ah,4ch
int 21h
endm
string macro str
mov ah,09h
mov dx,offset str
int 21h
endm
fopen macro file,attrib
mov ah,3dh
mov al,attrib
mov dx,offset file
int 21h
endm
malloc macro amount
mov ah,48h
mov bx,amount
int 21h
endm
mfree macro where
mov ah,49h
mov es,where
int 21h
endm
fread macro handle,bytes
push ax
push ds
push ax
mov ah,3fh
mov bx,[handle]
mov cx,bytes
xor dx,dx
pop ds
int 21h
pop ds
pop ax
endm
keyp macro
mov ah,0bh
int 21h
or al,al
endm
; **** static data ****
.CODE
org 100h
start: jmp begin
headup db 13,10,"JCLPLASM v1.3a - (C) 1994 JCL-Software (e-mail jcl1008@cus.cam.ac.uk)",13,10,"$"
noload db 13,10,7,"Can't open file PLASMA.DAT",13,10,"$"
nomalloc db 13,10,7,"Not enough base memory",13,10,"$"
datf db "PLASMA.DAT",0
handle dw 0
plasma_seg dw 0
move_seg dw 0
colour_seg dw 0
count dw 0
ASSUME DS:@code,ES:@code
; **** Code ****
.386
begin: ; *** Startup section ***
mov sp,offset tos ; set new stack
mov bx,last_inst-start+100h
shr bx,4 ; shrink memory usage to program size
inc bx ; in pages (16 bytes)
mov ah,4ah
int 21h
string headup ; display header message
malloc 9600+1 ; allocate memory for plasma buffer
jc nomem ; break if not enough memory
mov [plasma_seg],ax ; store address
malloc 2500+1 ; allocate memory for movement buffer
jc nomem ; as above...
mov [move_seg],ax
malloc 1920+1 ; allocate memory for colour buffer
jc nomem
mov [colour_seg],ax
jmp allocok ; skip the following
nomem: string nomalloc ; tell user no memory
end_process 255 ; and quit
allocok:
fopen datf,0 ; open PLASMA.DAT read only
jnc loadok ; oops - not here!
string noload ; so tell user
end_process 254 ; and quit
loadok: mov [handle],ax ; store handle
mov ax,[plasma_seg] ; get load segment for plasma data
mov cl,4 ; load in 8 steps
loadpl: push cx ; store loop count
fread handle,9600h ; read the data
add ax,960h ; increase pointer
pop cx ; restore loop count
dec cl ; decrement loop count
jnz loadpl ; and loop...
mov ax,[move_seg] ; read movement data
fread handle,40000
mov ax,[colour_seg] ; and color data
fread handle,30720
; *** plasma section ***
mov ax,13h ; set video mode 13
int 10h
mov ax,0a000h
mov es,ax
xor ax,ax ; clear ax
mov [count],ax ; store counter
mainloop:
waitfly:
mov dx,03dah ; VGA input status register 1
in al,dx ; load value
test al,08 ; vertical retrace??
je waitfly ; if not, try again...
mov si,[count] ; source = count *3
shl si,1
add si,[count]
mov dx,3c8h ; DAC index register
mov al,1 ; start with reg 1
out dx,al ; and load
inc dx ; DAC read/write register
mov cx,255 ; write 255 items
push ds ; store DS
mov ds,[colour_seg] ; address segment
cld ; ensure SI is incremented
setpl: outsb ; load R,G,B
outsb ; Note - REP OUTSB is too fast on
outsb ; some older VGA cards..
loop setpl ; so loop
pop ds ; and restore DS
mov di,[count] ; source = count * 4
shl di,2
push ds ; save DS (again...)
mov ds,[move_seg] ; get segment address of movement data
mov si,[di] ; load point 1
mov bx,[di+2] ; load point 2
pop ds ; restore DS
push ds ; and store it ...
mov ds,[plasma_seg] ; get segment of start of plasma
xor di,di ; DI = 0
mov ch,200 ; y loop = 200 pixels
pl1: mov cl,80 ; x loop = 80 * 4 = 320 pixels
pl2: lodsd ; get 4 source pixels
add eax,[si+bx] ; add 4 source pixels
stosd ; and store them
dec cl ; dec counter
jnz pl2 ; and loop..
sub si,320 ; reset source
mov dx,ds ; add 32 to DS -
add dx,32 ; move 32*16 = 512 bytes down in source memory
mov ds,dx
dec ch ; dec counter
jnz pl1 ; and loop..
pop ds ; restore DS (again)
inc word ptr [count]; increase counter
cmp word ptr [count],10000 ; reset it at end of cycle
jne noreset
mov word ptr [count],0
noreset:
keyp ; keypressed??
jnz closedown ; if yes then quit..
jmp mainloop
closedown:
mfree [colour_seg] ; free-up memory
mfree [move_seg]
mfree [plasma_seg]
mov ax,3h ; set text mode...
int 10h
end_process 0 ; byeeeeee...
nstack db 400 dup (?)
tos equ $
last_inst:
END start